#include <iostream>
using namespace std;

class Student{
    private:
        string name;
        int age;
    public:
        // 静态成员变量 也受访问控制权限的控制
        static int count;
        Student(string n, int a)\
            :name(n), age(a)\
            //, count(0)\{ // 报错 静态成员变量只能在全局处初始化
            {
            // 每次实例化对象时 count++
            count++;
        }
        ~Student(){
            // 每次消亡对象时 count--
            count--;
        }
};

// 静态成员变量 类外全局处初始化的方式
int Student::count = 0;

int main(int argc, const char *argv[]){
    Student s1("张三", 18);
    // 静态成员变量的访问方式1：通过类对象访问
    cout << s1.count << endl; // 1

    Student *p1 = new Student("李四", 20);
    // 静态成员变量的访问方式2：通过类指针访问
    cout << p1->count << endl; // 2
    delete p1;
    p1 = nullptr;

    // 静态成员变量的访问方式3：直接通过 类名:: 访问
    cout << Student::count << endl; // 1

    // 多个类对象是共用同一个静态成员变量的
    s1.count = 123;
    Student s2("小明", 22);
    cout << s1.count << endl; // 124
    cout << s2.count << endl; // 124

    return 0;
}